﻿/*--------------------1.计算对象坐标函数 fGetXY(对象)---------*/
/*坐标描述*/
function Point(iX, iY){
	this.left = iX;
	this.top = iY;
}
/*计算下拉框的坐标*/
function fGetXY(oTmp ){  
    var ctl=oTmp;
    var pt = new Point(0, 0);
   
//    while(oTmp&&oTmp.offsetParent) {
//        oTmp = oTmp.offsetParent;
//        pt.left += oTmp.offsetLeft;
//        pt.top += oTmp.offsetTop;
//    } 
    do{
        oTmp = oTmp.offsetParent;
        //if(oTmp=='[object]'&& oTmp.tagName!="BODY"&&oTmp.tagName!="HTML")
        if(oTmp!=null&&oTmp.tagName!="BODY"&&oTmp.tagName!="HTML")
        {
            pt.left += oTmp.offsetLeft;
            pt.top += oTmp.offsetTop;
        }
    } while(oTmp!=null&&oTmp.tagName!="BODY"&&oTmp.tagName!="HTML");

      pt.left=ctl.offsetLeft + pt.left+'px';
      pt.top = ctl.offsetTop + pt.top + ctl.offsetHeight + 2 + 'px';
      return pt;
}
/*计算下拉框的坐标 top无高度偏移量*/
function fGetXY2(oTmp ){  
  var ctl=oTmp;
  var pt = new Point(0, 0);
  while (oTmp && oTmp.offsetParent) {
      oTmp = oTmp.offsetParent;
      pt.left += oTmp.offsetLeft;
      pt.top += oTmp.offsetTop;
  }
//Chrome在查询弹出页时出现问题因此去掉HDS20160909
//  do {
//    	oTmp = oTmp.offsetParent;
//    	if(oTmp.id.indexOf("_PW-1")!=oTmp.id.length-5)
//    	{			
//  			pt.left += oTmp.offsetLeft;
//  			pt.top += oTmp.offsetTop;  	
//  		}
//  } while(oTmp=='[object]'&& oTmp.tagName!="BODY"&&oTmp.tagName!="HTML");
  
  pt.left=ctl.offsetLeft + pt.left+'px';
  pt.top = ctl.offsetTop + pt.top + 'px';  
  return pt;
}

/*--------------------2.隐藏 hideElement( 元素类型, 覆盖对象 )与显示函数showElement( 元素类型 )---------*/
/* 隐藏指定类型的元素 */
function hideElement( elmID, overDiv )
{
  if( (navigator.userAgent.toLowerCase().indexOf("opera") == -1) && (navigator.userAgent.toLowerCase().indexOf("msie") != -1) )
  {
	for( i = 0; i < document.getElementsByTagName( elmID ).length; i++ )
	{	
	  obj = document.getElementsByTagName( elmID )[i];
	  if( !obj || !obj.offsetParent )
	  {
		continue;
	  }
		  
	  objLeft   = obj.offsetLeft;
	  objTop	= obj.offsetTop;
	  objParent = obj.offsetParent;
	  
	  while(objParent=='[object]'&& objParent.tagName.toUpperCase() != "BODY" && objParent.id.indexOf("_PW-1")!=objParent.id.length-5)//objParent.id!='poplocate_PW-1')////*****//objParent.tagName.toUpperCase()!="HTML")
	  {
		objLeft  += objParent.offsetLeft;
		objTop   += objParent.offsetTop;
		objParent = objParent.offsetParent;			
	  }
		
	  objHeight = obj.offsetHeight;
	  objWidth = obj.offsetWidth;
	   	
		//计算是否有覆盖
	  if(( overDiv.offsetLeft + overDiv.offsetWidth ) <= objLeft );//在右边
	  else if(( overDiv.offsetTop + overDiv.offsetHeight ) <= objTop );//在上面
	  else if( overDiv.offsetTop >= ( objTop + objHeight ));//在下面
	  else if( overDiv.offsetLeft >= ( objLeft + objWidth ));//在左边
	  else
	  {
		obj.style.visibility = "hidden";			
	  }
	 
	}
  }
}
 
/*显示指定类型的元素*/
function showElement( elmID )
{
  if( (navigator.userAgent.toLowerCase().indexOf("opera") == -1) && (navigator.userAgent.toLowerCase().indexOf("msie") != -1) )
  {
	for( i = 0; i < document.getElementsByTagName( elmID ).length; i++ )
	{
	  obj = document.getElementsByTagName( elmID )[i];
	  
	  if( !obj || !obj.offsetParent )
	  {
		continue;
	  }	 
	  if(obj.NoDisplay==undefined || !obj.NoDisplay)		
		obj.style.visibility = "";
	}
  }
}

//单击当前层不隐藏
function DropClick(obj)
{
	if(obj.style.visibility=="hidden") return;
	sDropName=obj.id;	
	hideElement('SELECT', obj);	
	hideElement('APPLET', obj);
	hideElement('iframe', obj);
}

/*--------------------3.单击下拉框消失处理---------*/
//隐藏处理

/*变量*/
var sDropName="";			//下拉框的当前的对象名
var iDropCount=0;			//对象个数
var DropObj=new Array();	//下拉框对象名

var bShow = false;			//日历显示控制

/*增加下拉框对象*/
function DropOjbAdd(objname)	
{
	DropObj[iDropCount]=objname;		
	iDropCount++;
}

/*显示一个下拉框对象*/
function DropShow(objname)//显示或返回的对象
{
	var objnameid=objname;
	//两个参数:第二个对象用于返回对象名称
	var args = Array.prototype.slice.call(arguments,1); 
	if(args.length==1) objnameid=args[0];
	
	var DropName=objname+"_Drop";
	var DropVisible=false;	
	
	try{
			DropVisible=!eval(DropName+".GetClientVisible()");
		}catch(e)
		{
			DropVisible=document.getElementById(DropName).style.visibility=="hidden";			
		}	
		
	if(DropVisible)
	{		
		try{pt=fGetXY(document.getElementById(eval(objnameid + ".name")));}catch(e){} ;//objname为对象
		try{pt=fGetXY(document.getElementById(objnameid));}catch(e){} ;//objname为对象名称
		
		var DropNameId=DropName;		
		try{DropNameId=eval(DropName+".name");}catch(e){};
		if(typeof(DropNameId)=="undefined") DropNameId=DropName;
		
		document.getElementById(DropNameId).style.top=pt.top;
		document.getElementById(DropNameId).style.left=pt.left;		
		
		try{eval(DropName+".SetClientVisible(true)");}catch(e){};
		try{document.getElementById(DropName).style.visibility="visible";}catch(e){};		
		
		sDropName=DropName;
		hideElement('SELECT', document.getElementById(DropNameId) );//显示隐藏
		hideElement('APPLET', document.getElementById(DropNameId));//显示隐藏
		hideElement('iframe', document.getElementById(DropNameId));//显示隐藏
	}
}


/*隐藏所有下拉框对象*/
function DropHide()
{

}

/*键盘按钮处理*/
document.onkeypress = function hidecal1(event) 
{ 
	if(event==null) event=window.event;
	if (event.keyCode==27) 
	{
		hideCalendar();//日历隐藏
	}
};
/*方向键移动*/
document.onkeyup=function onKeyUp(event)
{
	if(event==null) event=window.event;
    PointerKeyUp(event.keyCode);
};

/*鼠标单击事件*/
document.onmousedown=function onMouseDown(event)
{
    if(event==null) event=window.event;
    //用于方向键移动   
    try{//不适合FF
    PointerCurIndex=event.srcElement.sourceIndex; 
    }catch(e){}
   
};

function hidecal3() {
    for (i = 0; i < DropObj.length; i++) {
        //if (DropObj[i] != sDropName) {
            try { eval(DropObj[i] + ".SetClientVisible(false)"); } catch (e) { };
            try { document.getElementById(DropObj[i]).style.visibility = "hidden"; } catch (e) { };
        //}
    }
}

document.onclick = function hidecal2(event) 
{
	if(event==null) event=window.event;
	for(i=0;i<DropObj.length;i++)
	{	
		if(DropObj[i]!=sDropName)	
		{
			try{eval(DropObj[i]+".SetClientVisible(false)");}catch(e){};
            //HDS20170802 Chrome支持问题跟jquery.show不同步
			//try{document.getElementById(DropObj[i]).style.visibility="hidden";}catch(e){};
			try{document.getElementById(DropObj[i]).style.display="none";}catch(e){};
		}
	}	
	if (!bShow)
	{
		//日历隐藏		
		if(typeof(crossobj)!="undefined")
		{	
			crossobj.visibility="hidden";
			if (crossMonthObj != null){crossMonthObj.visibility="hidden";}
			if (crossYearObj !=	null){crossYearObj.visibility="hidden";}
		}
	}
	if(sDropName==""&&!bShow)
	{
		showElement('SELECT');//显示所有元素
		showElement('APPLET');
		showElement('iframe');
	}
	
	sDropName="";
	bShow = false;
};

/*--------------------4.延迟函数 KeyDaley(执行函数[,参数1，参数2...])---------*/
/*若连续触发函数，通过延迟函数，将在一定时间范围内执行最后一个函数*/
/*将参数通过函数执行,再由计时器执行,带参数的计时器*/
setDelay= function(exefun,timeout)	
{  
	var args = Array.prototype.slice.call(arguments,2); 	
	var _cb = function()	
	{    
        	exefun.apply(null,args);
	};
	setTimeout(_cb,timeout);    
};
    
var __KeyEnd;
/*响应事件*/
function KeyExecute(DropStart,exefun,args)
{
	if(__KeyEnd==DropStart)
	{		
		exefun.apply(null,args);//执行
	}	
}
/*延迟函数 KeyDaley(执行函数[,参数1，参数2...])*/
function KeyDaley(exefun)	
{
	if(typeof(exefun)!="function")
	{		
		alert(exefun+"不是一个函数");
		return;
	}
	var date=new Date();
	var DropStart=date.getTime();	
	__KeyEnd=DropStart;
	
	var args = Array.prototype.slice.call(arguments,1); 	
	setDelay(KeyExecute,1000,DropStart,exefun,args);
}

/*------------------------------方向键移动--------------------------------------------*/


//当前光标所在对象索引
var PointerCurIndex=0;
//可焦点对象坐标
var PointerPosArray=new Array();

//计算所有可焦点对象坐标
function PointerPosInit()
{
    PointerPosInitTag("INPUT");
    PointerPosInitTag("TEXTAREA");
    PointerPosInitTag("SELECT");    
//    for(i=0;i<PointerPosArray.length;i++)
//    {
//        document.all["a1"].innerHTML+=i+":"+PointerPosArray[i]+"<br>"
//    }
}
function PointerPosInitTag(tag)
{
    var obj=document.getElementsByTagName(tag);//document.all.tags(tag);
    for(i=0;i<obj.length;i++)
        if(obj[i].type!='hidden'&&obj[i].disabled!=true&&obj[i].readOnly!=true)
        {         	    
            var pt=fGetXY2(obj[i]);
            PointerPosArray[PointerPosArray.length]=new Array(obj[i].sourceIndex,pt.left,pt.top,obj[i].offsetWidth,obj[i].offsetHeight);
        }  
}

//p2与p1在哪个方位上可移动:38↑40↓37←39→0不可移动
function PointerCross(p1,p2)
{   
    if(p1[0]==p2[0]) return 0;
    if(!(p2[1]+p2[3]<=p1[1] || p2[1]>=p1[1]+p1[3]))
    {
        return (p2[2]<=p1[2])?38:40;
    }
    if(!(p2[2]+p2[4]<=p1[2] || p2[2]>=p1[2]+p1[4]))
    {
        return (p2[1]<=p1[1])?37:39;
    }
    return 0;
}

//按键触发
function PointerKeyUp(key)
{   
    var n=-1;
    //var key=event.keyCode;
   
    if(key<37||key>40) return;
   
    //获取当前对象
    var CurArray=null;    
    for(i=0;i<PointerPosArray.length;i++)
    {
      if(PointerCurIndex==0 || PointerCurIndex==PointerPosArray[i][0])  
      { 
        CurArray=PointerPosArray[i];     
        break;
      }
    }   
    if(CurArray==null) return;
    
    //←时光标必须在开始位置,→光标必须在结束位置      
    if(document.all(CurArray[0]).type=="text"||document.all(CurArray[0]).type=="textarea")
    {
       var Pos=getPosition(document.all(CurArray[0])); 
       if((key==37&&Pos!=0) || (key==39&&document.all(CurArray[0]).value.length!=Pos))
            return;
    }
     //↑,↓对象必须不是下拉框、列表框      
    if(document.all(CurArray[0]).type=="select-one"||document.all(CurArray[0]).type=="select-multiple")
    {
        if(key==38 || key==40)
            return;
    }
   //a1.value=""
    //获取与当前对象相交的目标对象
    for(i=0;i<PointerPosArray.length;i++)
    {       
       if(PointerCross(CurArray,PointerPosArray[i])==key)
       { //a1.value+=","+PointerPosArray[i][0]
           if(n==-1
             || (key==38&&PointerPosArray[i][2]>PointerPosArray[n][2])
             || (key==40&&PointerPosArray[i][2]<PointerPosArray[n][2])
             || (key==37&&PointerPosArray[i][1]>PointerPosArray[n][1])
             || (key==39&&PointerPosArray[i][1]<PointerPosArray[n][1])
             )
             n=i; 
                   
       }
    }
    
    //移动到目标对象
    if(n!=-1) 
    {   try{    
        document.all(PointerPosArray[n][0]).focus();    
        if(document.all(PointerPosArray[n][0]).type=="text"||document.all(PointerPosArray[n][0]).type=="textarea")  
            document.all(PointerPosArray[n][0]).select();
        PointerCurIndex=PointerPosArray[n][0];     
        }catch(e){}; 
    }
}

//获取光标在文本中的位置
function getPosition(obj)
{ 
    var result = 0; 
    if(obj.selectionStart){ //IE以外 
        result = obj.selectionStart;
    }else{ //IE 
        var rng; 
        if(obj.type == "textarea")
        { 
            //rng = event.srcElement.createTextRange(); 
            //rng.moveToPoint(event.x,event.y); 
            return posCursor(obj);
        }else{ 
            rng = document.selection.createRange(); 
        } 
        rng.moveStart("character",-event.srcElement.value.length); 
        result = rng.text.length; 
    }    
    return result; 
} 

//计算textarea的起始光标
function posCursor(oTextarea)
{
    var start=0,end=0; 
     
    //selection 当前激活选中区，即高亮文本块，和/或文当中用户可执行某些操作的其它元素。
    //createRange 从当前文本选中区中创建 TextRange 对象，
    //或从控件选中区中创建 controlRange 集合。
    var sTextRange= document.selection.createRange();

    //判断选中的是不是textarea对象
    if(sTextRange.parentElement()== oTextarea)
    {
      //创建一个TextRange对象
      var oTextRange = document.body.createTextRange();
      //移动文本范围以便范围的开始和结束位置能够完全包含给定元素的文本。
      oTextRange.moveToElementText(oTextarea);
      
      //此时得到两个 TextRange
      //oTextRange文本域(textarea)中文本的TextRange对象
      //sTextRange是选中区域文本的TextRange对象

      //compareEndPoints方法介绍，compareEndPoints方法用于比较两个TextRange对象的位置
      //StartToEnd  比较TextRange开头与参数TextRange的末尾。
      //StartToStart比较TextRange开头与参数TextRange的开头。
      //EndToStart  比较TextRange末尾与参数TextRange的开头。
      //EndToEnd    比较TextRange末尾与参数TextRange的末尾。

      //moveStart方法介绍，更改范围的开始位置
      //character 按字符移动
      //word       按单词移动
      //sentence  按句子移动
      //textedit  启动编辑动作

      //这里我们比较oTextRange和sTextRange的开头，的到选中区域的开头位置
      for (start=0; oTextRange.compareEndPoints("StartToStart", sTextRange) < 0; start++)
      { 
        oTextRange.moveStart('character', 1); 
      }
      //需要计算一下\n的数目(按字符移动的方式不计\n,所以这里加上) 
      for (var i = 0; i <= start; i ++)
      {
        if (oTextarea.value.charAt(i) == '\n')
        { 
          start++; 
        }
      } 

      //再计算一次结束的位置
      oTextRange.moveToElementText(oTextarea); 
      for (end = 0; oTextRange.compareEndPoints('StartToEnd', sTextRange) < 0; end ++){
        oTextRange.moveStart('character', 1);
      }
      for (var i = 0; i <= end; i ++)
      {
        if (oTextarea.value.charAt(i) == '\n')
        { 
          end++; 
        }
      }
    }
      
    return start;       
}
/*--------------------------------*/